import ast
import logging
from typing import Optional, List, Set

from 程序核心代码.ast节点.节点定义.基础定义.ast节点基础定义 import ast节点基础模型
from 程序核心代码.ast节点.节点定义.基础定义.节点状态管理 import 节点状态类型

logger = logging.getLogger(__name__)

class 判断ast节点基础模型(ast节点基础模型):
    """判断节点类，用于处理while循环控制流"""
    
    def __init__(self, ast节点: ast.While, 节点管理器,
                 节点位置: Optional[List] = None, 上级节点: Optional['ast节点基础模型'] = None):
        super().__init__(ast节点, 所属节点模型管理器, "判断ast节点基础模型", "控制流", 节点位置, True, 上级节点)
        
        # 循环相关属性
        self.条件表达式 = None
        self.循环主体: Set[ast节点基础模型] = set()
        self.否则主体: Set[ast节点基础模型] = set()
        self.当前迭代次数 = 0
        self.最大迭代次数 = 1000  # 防止无限循环
        
        # 添加接口
        self.添加接口("控制流", "输入", "控制输入")
        self.添加接口("控制流", "输出", "主体输出")
        self.添加接口("控制流", "输出", "否则输出")
        self.添加接口("数据流", "输入", "条件输入")
        
    def 节点数据解析(self) -> None:
        """解析节点数据"""
        try:
            # 解析条件表达式
            self.条件表达式 = self.所属节点模型管理器.创建节点(self.ast节点.test)
            if not self.条件表达式:
                self.添加错误信息("条件表达式创建失败")
                return
                
            # 解析循环主体
            for 语句 in self.ast节点.body:
                节点 = self.所属节点模型管理器.创建节点(语句, 上级节点=self)
                if 节点:
                    self.循环主体.add(节点)
                    
            # 解析else部分
            for 语句 in self.ast节点.orelse:
                节点 = self.所属节点模型管理器.创建节点(语句, 上级节点=self)
                if 节点:
                    self.否则主体.add(节点)
                    
            # 更新节点显示名称
            self.节点标题名称 = "while循环"
            
        except Exception as e:
            logger.error(f"判断节点数据解��失败: {str(e)}")
            self.添加错误信息(f"数据解析失败: {str(e)}")
            
    def 检查条件(self) -> bool:
        """检查循环条件"""
        try:
            if not self.条件表达式:
                self.添加错误信息("条件表达式未定义")
                return False
                
            # 获取条件值
            条件值 = self.条件表达式.获取变量值()
            if 条件值 is None:
                self.添加错误信息("条件值获取失败")
                return False
                
            return bool(条件值)
            
        except Exception as e:
            logger.error(f"条件检查失败: {str(e)}")
            self.添加错误信息(f"条件检查失败: {str(e)}")
            return False
            
    def 执行循环(self) -> None:
        """执行循环"""
        try:
            self.当前迭代次数 = 0
            条件满足 = False
            
            # 执行循环
            while self.检查条件():
                条件满足 = True
                
                # 检查最大迭代次数
                if self.当前迭代次数 >= self.最大迭代次数:
                    self.添加错误信息(f"超过最大迭代次数 {self.最大迭代次数}")
                    break
                    
                # 执行循环体
                for 节点 in self.循环主体:
                    节点.执行()
                    
                self.当前迭代次数 += 1
                
            # 如果循环正常结束且有else部分
            if not 条件满足 or self.当前迭代次数 > 0:
                for 节点 in self.否则主体:
                    节点.执行()
                    
            self.状态管理器.更新状态(节点状态类型.已完成)
            
        except Exception as e:
            logger.error(f"循环执行失败: {str(e)}")
            self.添加错误信息(f"执行失败: {str(e)}")
            
    def 创建独立节点(self) -> None:
        """创建独立的AST节点"""
        self.ast节点 = ast.While(
            test=ast.Constant(value=True),
            body=[ast.Pass()],
            orelse=[]
        )
        
    def __str__(self) -> str:
        """返回判断节点的字符串表示"""
        return f"{self.获取属性("节点名称")}(迭代次数={self.当前迭代次数})" 